home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSXSRC.LZH / SW_SUB.HAS < prev    next >
Text File  |  1995-03-20  |  4KB  |  225 lines

  1. *
  2. *
  3. *スイッチ処理ルーチン
  4. *
  5. *
  6. *    -A<short> -Z<short>
  7.  
  8.  
  9.     .include    DOSCALL.MAC    *標準の奴(XC)
  10.     .include    SXCALL.MAC
  11.     .include    SXCALL.H
  12.     .include    YOU200.MAC    *独自のマクロ定義ファイルです
  13.     .include    HASMACRO.MAC    *HAS2.5以降のマクロパッケージ
  14.  
  15.     .include    WORK.INC    *ワークエリアの内容を定義するファイル
  16.     .include    FLAG.INC    *条件付アセンブル処理を定義するファイル
  17.  
  18.  
  19. *==============================================*
  20. .iff    OPTION_SW=0
  21. .xref    PrintMyErr
  22.  
  23. reglist    reg d1-d7/a1-a4
  24. ofs    =    -8
  25. .offset    ofs
  26. Numptr:        ds.l    1
  27. Numptr2:    ds.l    1
  28.         ds.l    2
  29. SWmode:        ds.w    1    *関数のモード0=CHECK,1=SAVE,2=EXCHG
  30. SWptr:        ds.l    1    *argtbl(l),null,swstr(short)+swnum(short)
  31. .text
  32. *==============================================*
  33. SWITCHproc::
  34.  
  35.     link    a6,#ofs
  36.  
  37.     ifeq    <cmp.w    #SW_SAVE,SWmode(a6)>
  38.         jbsr    SW_saving
  39.     elseifeq <cmp.w    #SW_CHK,SWmode(a6)>
  40.         jbsr    SW_setting
  41.     elseifeq <cmp.w    #SW_EXCHG,SWmode(a6)>    *スイッチの変更
  42.         jbsr    SW_exchange
  43.     endif
  44.  
  45.     unlk    a6
  46.     rts
  47.  
  48. SW_setting:
  49.     movem.l    reglist,-(sp)
  50.  
  51.     move.l    SWptr(a6),a1
  52. *    lea.l    SW_WORK(a5),a0
  53. *    move.l    a0,Numptr(a6)        *a0=パラメータ数値格納ワークのadr
  54.  
  55.     ifne    <move.l    (a1)+,d1>    *最初の4バイトはパラメータの数
  56.         jbsr    ChkSw0        *パラメータ処理ルーチンへ
  57.     else
  58.         ~T            *パラメータなしなら正常終了しちゃう
  59.     endif
  60.  
  61.     movem.l    (sp)+,reglist
  62.     rts
  63.  
  64. ChkSw0:
  65.     repeat
  66.         movea.l    (a1)+,a2        *a2=文字列のadr.
  67.         ifeq    <cmpi.b    #'-',(a2)>
  68.             jbsr    ChkSw1
  69.             breakmi    <tst.l    d0>
  70.         elseifeq <cmpi.b #'/',(a2)>
  71.             jbsr    ChkSw1
  72.             breakmi    <tst.l    d0>
  73.         else
  74.             jbsr    ChkSw_filename    *ファイル名指定とみなしてチェック(未)
  75.             breakmi    <tst.l    d0>
  76.         endif
  77.     untileq    <subq.l    #1,d1>
  78.  
  79.     rts
  80.  
  81. ChkSw1:
  82.     lea.l    SWSTR(pc),a3        *スイッチテーブルadr.
  83.     lea.l    SW_Flag(a5),a4        *スイッチのON/OFFのフラグのwork
  84.     moveq    #1,d4
  85.     lea.l    SW_WORK(a5),a0
  86.     move.l    a0,Numptr(a6)        *先頭に戻す
  87.  
  88.     repeat
  89.         move.b    (a3),d3        *スイッチ文字列
  90.         move.b    d3,d5
  91.         add.b    #$20,d3        *小文字にしたもの
  92.  
  93.         ifeq    <cmp.b    1(a2),d5>    *大文字でチェック 
  94.             move.b    #$ff,(a4)    *ONに
  95.             ifne    <tst.b    2(a2)>
  96.                 jbsr    ChkNum    *数値付きかチェック
  97.                 ifmi    <tst.l    d0>
  98.                     ~T
  99.                     break
  100.                 endif
  101.  
  102.             endif
  103.             ~F
  104.             break            *マッチしたら抜ける
  105.         elseifeq <cmp.b 1(a2),d3>    *小文字でチェック
  106.             move.b    #$ff,(a4)    *ON
  107.             ifne    <tst.b    2(a2)>
  108.                 jbsr    ChkNum
  109.                 ifmi    <tst.l    d0>
  110.                     ~T
  111.                     break
  112.                 endif
  113.             endif
  114.             ~F
  115.             break
  116.         endif
  117.  
  118.         add.l    #1,a3            *マッチング用の文字列を進める
  119.         add.l    #1,a4
  120.         add.l    #2,Numptr(a6)        *数値用のグローバルワークを進める
  121.         ~T
  122.         lsl.l    #1,d4
  123.     untileq    <tst.b    (a3)>            *最後までマッチしないこともある
  124.  
  125.     and.l    #USABLE_SW,d4
  126.     ifeq    <tst.l    d4>            *d4=使用可能スイッチにマッチしているか
  127.         lea.l    sw_e_mes1(pc),a0
  128.         jbsr    PrintMyErr
  129.         ~F
  130.     elseifeq    <tst.l    d0>        *不正なスイッチ文字、数字の場合
  131.         lea.l    sw_e_mes2(pc),a0
  132.         jbsr    PrintMyErr
  133.         ~F
  134.     else
  135.         ~T
  136.     endif
  137.         rts
  138.  
  139. ChkNum:
  140.     pea.l    2(a2)                *文字列を数値に
  141.     SX    $A3DF,4                *SXCALL    SXSTOL
  142.     ifmi    <tst.l    d0>
  143.         ~F
  144.     else
  145.         move.l    Numptr(a6),a0
  146.         move.w    d0,(a0)            *スイッチに付随する数値をワークにセット
  147.         ~T
  148.     endif
  149.     rts
  150.  
  151. ChkSw_filename:
  152.     *未記述:ファイルネームには未対応
  153.     ~T
  154.     rts
  155.  
  156. SWSTR:
  157.     dc.b    'ABCDEFGHIJKLMNOPQRSTUVWXYZ',0
  158. .even
  159. sw_e_mes1:
  160.     dc.b    '無効なスイッチです。おしまい',0
  161. .even
  162. sw_e_mes2:
  163.     dc.b    '無効なスイッチです。だめだこりゃ',0
  164. .even
  165. .endif
  166.  
  167. *======================================================*
  168. *オプション文字列をセーブする
  169. *-Wオプションは考慮しない。
  170. *======================================================*
  171. .offset    -512
  172. tdb_wk        ds.b    90
  173. tdb_cmdL:    ds.b    1
  174. tdb_cmdline:    ds.b    1
  175. .text
  176. SW_saving:
  177.     link    a6,#-512
  178.     movem.l    a1-a2,-(sp)
  179.     lea.l    SW_Flag(a5),a1
  180.  
  181.  
  182.         move.w    #-1,-(sp)
  183.         pea.l    -512(a6)
  184.         SX    __TSGetTdb,6
  185.  
  186.         lea.l    tdb_cmdL(a6),a1        *文字先頭アドレス
  187.         lea.l    SW_Flag(a5),a2
  188.  
  189.     ifne    <tst.b    SW_I(a2)>
  190.         move.b    #3,(a1)+
  191.         move.b    #' ',(a1)+
  192.         move.b    #'-',(a1)+
  193.         move.b    #'I',(a1)
  194.     endif
  195.  
  196.         move.w    #-1,-(sp)
  197.         pea.l    -512(a6)
  198.         SX    __TSSetTdb,6
  199.  
  200.     movem.l    (sp)+,a1-a2
  201.     unlk    a6
  202.     rts
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209. *======================================================*
  210. *使用中のスイッチの変更(トグル)
  211. *======================================================*
  212. SW_exchange:
  213.     lea    SW_Flag(a5),a0
  214.     adda.w    SWptr(a6),a0
  215.     not.b    (a0)
  216.  
  217.     lea.l    SW_WORK(a5),a0        *スイッチに付いている数字のワーク
  218.     move.w    SWptr(a6),d0
  219.     add.w    d0,d0            *2TIMES
  220.     adda.w    d0,a0
  221.     move.w    SWptr+2(a6),(a0)
  222.  
  223.     rts
  224. .end
  225.